/**
 * 
 */
package br.com.sistransporte.transite.linha.dao;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

import br.com.sistransporte.transitevo.linha.model.LinhaVO;
import br.com.src.masterpersistence.dao.GenericDAO;
import br.com.src.masterpersistence.exceptions.AlterarException;
import br.com.src.masterpersistence.exceptions.ExcluirException;
import br.com.src.masterpersistence.exceptions.FiltrarException;
import br.com.src.masterpersistence.exceptions.HibernatePersistenceException;
import br.com.src.masterpersistence.exceptions.InserirException;
import br.com.src.masterpersistence.utilidades.FabricaMensagensLog;
import br.com.src.masterpersistence.utilidades.Paginacao;
import br.com.src.utilidades.exceptions.DesconhecidoException;

/**
 * Classe que representa
 *
 *
 * @author Nelson Luis da Silva Junior <nelson.jr13@hotmail.com@>
 * @since 5 de Jul de 2013 00:44:53
 * @version 1.0
 */
public class LinhaDAOImpl extends GenericDAO< LinhaVO > implements LinhaDAOService{

	public LinhaDAOImpl(String typeSessionFactory) {
		super(typeSessionFactory);
		logger.info( FabricaMensagensLog.getMensagemLogConstrutor("LinhaDAOImpl") );
	}

	
	public ArrayList<LinhaVO> filtrar(LinhaVO vo, boolean isDisticnt,boolean isLike) throws FiltrarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio("LinhaDAOImpl") );
		try {
			ArrayList< LinhaVO > lista = filter( vo, isDisticnt, isLike );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "LinhaDAOImpl" ) );
			return lista;
		} catch ( IllegalArgumentException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro("LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( IllegalAccessException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( InvocationTargetException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( Exception e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", new DesconhecidoException( e.getMessage(), e ) ) );
			throw new FiltrarException( e.getMessage(), e );
		}
	}
	
	

	public LinhaVO inserir(LinhaVO vo) throws InserirException {
		try {
			logger.info( FabricaMensagensLog.getMensagemLogInicio( "LinhaDAOImpl" ) );
			LinhaVO objetoPersistido = (LinhaVO) insert( vo );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "LinhaDAOImpl" ) );
			return objetoPersistido;
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new InserirException( e.getMessage(), e );
		}
	}

	
	public void alterar(LinhaVO vo) throws AlterarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "LinhaDAOImpl" ) );
		try {
			update( vo );
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro("LinhaDAOImpl", e ) );
			throw new AlterarException( e.getMessage(), e );
		}
		logger.info( FabricaMensagensLog.getMensagemLogTermino("LinhaDAOImpl" ) );
	}

	
	public void excluir(LinhaVO vo) throws ExcluirException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "LinhaDAOImpl" ) );
		try {
			delete( vo );
		} catch ( HibernatePersistenceException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new ExcluirException( e.getMessage(), e );
		}
		logger.info( FabricaMensagensLog.getMensagemLogTermino( "LinhaDAOImpl" ) );
	}

	
	public ArrayList<LinhaVO> filtrarPaginacao(Paginacao<LinhaVO> pagination, LinhaVO vo, boolean isDisticnt,	boolean isLike) throws FiltrarException {
		logger.info( FabricaMensagensLog.getMensagemLogInicio( "LinhaDAOImpl" ) );
		try {
			ArrayList< LinhaVO > lista = paginacao( pagination, vo, isDisticnt, isLike );
			logger.info( FabricaMensagensLog.getMensagemLogTermino( "LinhaDAOImpl" ) );
			return lista;
		} catch ( IllegalArgumentException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( IllegalAccessException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( InvocationTargetException e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", e ) );
			throw new FiltrarException( e.getMessage(), e );
		} catch ( Exception e ) {
			logger.info( FabricaMensagensLog.getMensagemLogErro( "LinhaDAOImpl", new DesconhecidoException( e.getMessage(), e ) ) );
			throw new FiltrarException( e.getMessage(), e );
		}
		
	}
	
	@Override
    public Integer getTotalCadastrados( LinhaVO entidade, boolean isDisticnt, boolean isLike ) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		return super.getTotalCadastrados( entidade, isDisticnt, isLike );
	    
    }

}
